home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / misc / math / CalcE_Pi_src.lha / CalcPI / src / CalcPI.c next >
Encoding:
C/C++ Source or Header  |  1996-04-01  |  2.1 KB  |  116 lines

  1. #include <proto/dos.h>
  2. #include <proto/exec.h>
  3. #include <exec/memory.h>
  4.  
  5. #define TEMPLATE "DECIMALES/N"
  6. #define MEM "Pas assez de mémoire.\n"
  7. #define MSG "\n \033[1mCalcPI 1.0\033[0m      Ringard' Production 95\n\n   Allenbrand Brice\n   5 rue du Manège\n   68100 Mulhouse\n\n"
  8.  
  9.  
  10. int pi(void)
  11. {
  12.  struct DosLibrary *DOSBase;
  13.  struct RDArgs *rdargs;
  14.  long t,r,n,i=1,l=1,ret=RETURN_FAIL;
  15.  long *x,*y,*z,*u,*s; 
  16.  long k,g=0,h=0,f=0;
  17.  long opts[]={0,0};
  18.  
  19.  if(DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",0))
  20.  {
  21.   rdargs=ReadArgs(TEMPLATE,opts,NULL);
  22.   if(opts[0])
  23.   {
  24.    n=((*(long *)(opts[0]))+11)>>2;
  25.    if(x=(long *)AllocVec(n*sizeof(long)*5,MEMF_PUBLIC|MEMF_CLEAR))
  26.    {
  27.     y=x+n;
  28.     z=y+n;
  29.     s=z+n;
  30.     u=s+n;
  31.     n-=2;
  32.     x[0]=18*48;y[0]=32*57;z[0]=-20*239;
  33.     do
  34.     {
  35.      switch((g>n)+(h>n))
  36.      {
  37.       case 0:
  38.        r=0;
  39.        for(k=h;k<=n;k++)
  40.        {
  41.         t=r+z[k];z[k]=t/57121;
  42.         if(z[k]<0)
  43.          z[k]--;
  44.         r=(t-z[k]*57121)*10000;
  45.        }
  46.        if(z[h]==0)
  47.         h++;
  48.       case 1:
  49.        r=0;
  50.        for(k=g;k<=n;k++)
  51.        {
  52.         t=r+y[k];y[k]=t/3249;r=(t-y[k]*3249)*10000;
  53.        }
  54.        if(y[g]==0)
  55.         g++;
  56.      }
  57.      r=0;
  58.      for(k=f;k<=n;k++)
  59.      {
  60.       t=r+x[k];x[k]=t/324;r=(t-x[k]*324)*10000;
  61.      }
  62.      r=0;
  63.      for(k=n;k>=f;k--)
  64.      {
  65.       t=r+x[k]+y[k]+z[k];r=t/10000;u[k]=t-r*10000;
  66.      }
  67.      r=0;
  68.      for(k=f;k<=n;k++)
  69.      {
  70.       t=r+u[k];u[k]=t/i;r=(t-u[k]*i)*10000;
  71.      }
  72.      r=0;
  73.      for(k=n;k>=f;k--)
  74.      {
  75.       t=r+l*u[k]+s[k];r=t/10000;s[k]=t-r*10000;
  76.      }
  77.      l=-l;i+=2;
  78.      if(x[f]==0)
  79.       f++;
  80.     }
  81.     while(u[n]>0);
  82.     for(k=n;k>=1;k--)
  83.      if(s[k]<0)
  84.      {
  85.       s[k]+=10000;
  86.       s[k-1]--;
  87.      }
  88.     Printf("PI=\n3.");
  89.     for(k=1;k<=n;k++)
  90.     {
  91.      if(s[k]<10)
  92.       Printf("000");
  93.      else
  94.       if(s[k]<100)
  95.        Printf("00");
  96.       else
  97.       if(s[k]<1000)
  98.        Printf("0");
  99.      Printf("%ld ",s[k]);
  100.      if(k%7==0)
  101.       Printf("\n  ");
  102.     }
  103.     Printf("\n");
  104.     ret=RETURN_OK;
  105.     FreeVec(x);
  106.    }
  107.    else
  108.     Printf(MEM);
  109.    FreeArgs(rdargs);
  110.   }
  111.   else
  112.    Printf(MSG);
  113.   CloseLibrary((struct Library *)DOSBase);
  114.  }
  115.  return(ret);
  116. }